"""
为类添加多个信号
"""
from PyQt5.QtCore import *


class MultiSiganl(QObject):

    signal1 = pyqtSignal()          # 定义一个信号（无参数）

    signal2 = pyqtSignal(int)       # 定义一个带参数的信号

    signal3 = pyqtSignal(int, str)  # 定义一个两参数（整数型、字符型）的信号

    signal4 = pyqtSignal(list)      # 定义一个列表型的信号

    signal5 = pyqtSignal(dict)      # 定义一个字典型的信号

    # 注意下面的[]并不是指列表，而是声明一个重载版本的信号
    signal6 = pyqtSignal([int, str], [str])
    # 也就是[int, str]和[str]是或的关系，即这个信号可以对应两个槽，
    # 也就是槽函数的参数可以是int和str类型也可以是[str]类型

    def __init__(self):
        super(MultiSiganl, self).__init__()

        # 下面是将信号和槽相互关联起来
        self.signal1.connect(self.signalCall1)
        self.signal2.connect(self.signalCall2)
        self.signal3.connect(self.signalCall3)
        self.signal4.connect(self.signalCall4)
        self.signal5.connect(self.signalCall5)
        self.signal6.connect(self.signalCall6)                # 没有给出signal6的传递类型，那就是默认第一类。
        self.signal6[str].connect(self.signalCall6Overload)   # 指定了signal6的传递类型，那后面关联的函数就要发生变化
        # 对于信号6 我们想要实现信号重载，也就是想要将信号6和两个槽函数连接起来

        # 下面是信号触发
        self.signal1.emit()
        self.signal2.emit(10)
        self.signal3.emit(1, "hello world")
        self.signal4.emit([1, 2, 3, 4, 5, 6])
        self.signal5.emit({"name": "bill", "age": "18"})
        self.signal6[int, str].emit(20, "test")
        # 注意：重载时我们不仅要在关联的时候进行指定，也要在信号生成时指定传递类型
        self.signal6[str].emit("test")

        # 下面就是定义槽函数
    def signalCall1(self):
            print("signal emit")

    def signalCall2(self, val):
        print("signal2 emit, value:", val)

    def signalCall3(self, val, text):
        print("signal3 emit,value:", val, text)

    def signalCall4(self, val):
        print("signal4 emit,value:", val)

    def signalCall5(self, val):
        print("signal5 emit,value:", val)

    def signalCall6(self, val, text):
        print("signal6 emit,value:", val, text)

    def signalCall6Overload(self, val):
        print("signal6 overload emit,value:", val)


if __name__ == '__main__':
    multiSignal = MultiSiganl()   # 首先创建一个类对象（方便调用类当中的方法）


#  这里主要实现了一个信号可以对应多个槽
#  只不过需要注意的是：在信号生成时，以及信号和槽连接的时候都需要指定信号的参数类型，否则会报错
